use std::fmt::format;
use ratatui::buffer::Buffer;
use ratatui::layout;
use ratatui::layout::{Constraint, Direction, Rect};
use ratatui::style::{Color, Style};
use ratatui::widgets::{Paragraph, Widget};
use crate::misc::readable_home;
use crate::ui::Ctx;
use crate::ui::header::tabs::Tabs;

pub struct Layout<'a>{
    cx: &'a Ctx ,  // 上下文对象  包含应用的全局状态
}

impl <'a> Layout<'a> {
    pub fn new(cx:&'a Ctx) -> Self{
        Self{
            cx 
        }
    }
}

impl <'a> Widget for Layout<'a> {
    fn render(self, area: Rect , buf: &mut Buffer) {
        // 划分布局区域
        let chunks = layout::Layout::default()
            .direction(Direction::Horizontal)  // 水平方向切割
            .constraints([Constraint::Percentage(50),Constraint::Percentage(50)].as_ref()) // 左右各占50%
            .split(area) ;  // 将输入的区域分割成两个子区域
        // 处理左侧区域  显示当前目录
        let current = &self.cx.manager.current() ; // 从上下文获取当前活跃的目录信息
        let location = if current.in_search{
            // 如果处于搜索模式  路径后写添加 search 标识
            format!("{} (search)" , readable_home(&current.cwd)) 
        }else {
            // 普通模式直接显示路径
            format!("{}", readable_home(&current.cwd))
        } ; 
        // 渲染左侧路径文本
        Paragraph::new(location)
            .style(
                Style::default().fg(Color::Cyan))  // 当前目录的文本颜色
            .render(chunks[0] , buf) ;
        // 渲染信息写入了buf  所有组件的渲染信息写到buf中  最终一次性将整个界面的内容输出到终端
        // 处理右侧区域  显示标签组件  
        Tabs::new(self.cx).render(chunks[1] , buf) ; 
    }
}